﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Worktool.CODE_Chris.SQL_DATA;

namespace Worktool.CODE_Chris.Word_Schnittstelle
{
    public class WordLoadData
    {
        private SQL sql;

        public WordLoadData()
        {
            init();
        }

        private void init()
        {
            sql = new SQL();
        }

        public String[,] loadDataHeader(String idAuftrag)
        {
            String[,] dataAuftrag = sql.receiveSQL("SELECT RIGHT('000000'+CAST(ISNULL(id,'') AS NVARCHAR(6)),6) AS ID,Bemerkung,Ansprechpartner,SollFertigstellung_HH,Lagerort FROM tbl_fertigungsauftrag WHERE ID = " + idAuftrag);

            String[,] data = new String[2, 6];
            try
            {
                //Teilnehmerdaten
                data[0, 0] = "{AUFTRAGSNUMMER}";
                data[0, 1] = "{LAGERORT}";
                data[0, 2] = "{ANSPRECHPARTNER}";
                data[0, 3] = "{DRUCKDATUM}";
                data[0, 4] = "{SCHIFFSBEZEICHNUNG}";
                data[0, 5] = "{DATUM_SOLL}";

                data[1, 0] = dataAuftrag[0, 0];
                data[1, 1] = dataAuftrag[4, 0];
                data[1, 2] = dataAuftrag[2, 0];
                data[1, 3] = DateTime.Now.Date.ToShortDateString();
                data[1, 4] = Login.currentDBName;
                data[1, 5] = DateTime.Parse(dataAuftrag[3, 0], CultureInfo.GetCultureInfo("de-DE")).Date.ToShortDateString();
            }
            catch (Exception e)
            {
                //sql.log("FEHLER", e, this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name);
                MessageBox.Show("Es fehlen Werte zum Erstellen der Word-Datei. Vorgang abgebrochen.", "Fehler");
                return null;
            }

            return data;
        }

        public void processDetails(Microsoft.Office.Interop.Word.Application word, String idAuftrag)
        {
            //Detaildaten
            String[,] groups = sql.receiveSQL("SELECT Manufacturer, Model FROM [vw_comm_Lieferkette] WHERE ID_MaterialDetailExtended IN (SELECT ID_MatDetailExt FROM tbl_fertigungsauftrag_matching WHERE ID_Fertigungsauftrag = " + idAuftrag + ") GROUP BY Manufacturer, Model");
            for (int a = 0; a < groups.GetLength(1); a++)
            {
                //Auswahl aufheben und Cursor an das Ende des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToLast, null, null);

                //Gruppen durchlaufen
                String[,] groupDetail = sql.receiveSQL("SELECT a.ID_MaterialDetailExtended,a.Manufacturer,a.Model," +
                    "(SELECT Remarks FROM TOOL_materialSumme WHERE ID = b.ID_Summe) AS Remark,(SELECT Description FROM TOOL_materialSumme WHERE ID = b.ID_Summe) AS Description," +
                    "a.Venue,a.Positions_ID," +
                    "a.veredelungsSchritt,(SELECT Bemerkung FROM tbl_fertigungsauftrag WHERE ID = 4) AS Anmerkung " +
                    "FROM [vw_comm_Lieferkette] a JOIN TOOL_materialDetail b ON a.ID_MaterialDetail = b.ID " +
                    "WHERE a.ID_MaterialDetailExtended IN (SELECT ID_MatDetailExt FROM tbl_fertigungsauftrag_matching WHERE ID_Fertigungsauftrag = " + idAuftrag + ") " +
                    "AND a.Manufacturer = '" + groups[0, a] + "' AND a.Model = '" + groups[1, a] + "'");

                //Detaildaten in Word-template für Details laden und in Clipboard kopieren
                //String[,] data = wordLoad.loadDataDetail(groupDetail);
                Microsoft.Office.Interop.Word.Application wordDetail = getDetailData("Templates\\"+Login.currentDBName+"\\MaterialFlow\\DeliveryChain\\Fertigung\\FertigungsData_TEMPLATE.doc", groupDetail);
                wordDetail.ActiveWindow.Selection.WholeStory();
                wordDetail.ActiveWindow.Selection.Copy();
                wordDetail.Quit(SaveChanges: false);
                Marshal.ReleaseComObject(wordDetail);

                word.ActiveWindow.Selection.Paste();
            }

            //Footer-Daten
            String[,] groupFooter = sql.receiveSQL("SELECT Bemerkung FROM tbl_fertigungsauftrag WHERE ID = " + idAuftrag);

            //Auswahl aufheben und Cursor an das Ende des Documents rücken
            word.Selection.Move();
            word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToLast, null, null);

            Microsoft.Office.Interop.Word.Application wordFooter = getFooterData("Templates\\"+Login.currentDBName+"\\MaterialFlow\\DeliveryChain\\Fertigung\\FertigungsFooter_TEMPLATE.doc", groupFooter);
            wordFooter.ActiveWindow.Selection.WholeStory();
            wordFooter.ActiveWindow.Selection.Copy();

            wordFooter.Quit(SaveChanges: false);
            Marshal.ReleaseComObject(wordFooter);

            word.ActiveWindow.Selection.Paste();
        }

        public Microsoft.Office.Interop.Word.Application getFooterData(String templatePath, String[,] data)
        {
            Object oMissing = System.Reflection.Missing.Value;
            var word = new Microsoft.Office.Interop.Word.Application();
            var doc = new Microsoft.Office.Interop.Word.Document(word);

            //Netzlaufwerk-Ordner aus der XML-Datei
            String originalPath = Path.Combine(Login.dictSettings["netzwerkordner"], templatePath);
            try
            {
                //Neue Word-Datei mit Daten füllen
                word.Visible = false;
                doc = word.Documents.Open(originalPath);

                //Auswahl aufheben und Cursor an den Start des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                while (word.Selection.Find.Execute("{ANMERKUNG}"))
                {
                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                    word.Selection.Find.Execute("{ANMERKUNG}", ReplaceWith: data[0, 0]);

                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                }

                return word;
            }
            catch (Exception e)
            {
                word.Quit(SaveChanges: false);
                Marshal.ReleaseComObject(word);
                //sql.log("FEHLER", e, this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name);
                return null;
            }
        }

        public Microsoft.Office.Interop.Word.Application getDetailData(String templatePath, String[,] data)
        {
            Object oMissing = System.Reflection.Missing.Value;
            var word = new Microsoft.Office.Interop.Word.Application();
            var doc = new Microsoft.Office.Interop.Word.Document(word);

            //Netzlaufwerk-Ordner aus der XML-Datei
            String originalPath = Path.Combine(Login.dictSettings["netzwerkordner"], templatePath);
            try
            {
                //Neue Word-Datei mit Daten füllen
                int count = data.GetLength(1);
                word.Visible = false;
                //word.Documents.Open(originalPath);
                doc = word.Documents.Open(originalPath);
                doc.Tables[1].Rows[8].Cells[1].Range.Text = data[5, data.GetLength(1) - 1];
                doc.Tables[1].Rows[8].Cells[2].Range.Text = data[6, data.GetLength(1) - 1];
                doc.Tables[1].Rows[8].Cells[3].Range.Text = "1";

                for (int a = data.GetLength(1) - 2; a >= 0; a--)
                {
                    doc.Tables[1].Rows.Add(doc.Tables[1].Rows[8]);
                    doc.Tables[1].Rows[8].Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleNone;
                    doc.Tables[1].Rows[8].Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderTop].LineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleNone;
                    doc.Tables[1].Rows[8].Cells[1].Range.Text = data[5, a];
                    doc.Tables[1].Rows[8].Cells[2].Range.Text = data[6, a];
                    doc.Tables[1].Rows[8].Cells[3].Range.Text = "1";
                }

                doc.Tables[1].Rows[7].Borders[Microsoft.Office.Interop.Word.WdBorderType.wdBorderBottom].LineStyle = Microsoft.Office.Interop.Word.WdLineStyle.wdLineStyleSingle;

                //Auswahl aufheben und Cursor an den Start des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                while (word.Selection.Find.Execute("{MANUFACTURER}"))
                {
                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                    word.Selection.Find.Execute("{MANUFACTURER}", ReplaceWith: data[1, 0]);

                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                }

                //Auswahl aufheben und Cursor an den Start des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                while (word.Selection.Find.Execute("{MODEL}"))
                {
                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                    word.Selection.Find.Execute("{MODEL}", ReplaceWith: data[2, 0]);

                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                }

                //Auswahl aufheben und Cursor an den Start des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                while (word.Selection.Find.Execute("{REMARK}"))
                {
                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                    word.Selection.Find.Execute("{REMARK}", ReplaceWith: data[3, 0]);

                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                }

                //Auswahl aufheben und Cursor an den Start des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                while (word.Selection.Find.Execute("{DESCRIPTION}"))
                {
                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                    word.Selection.Find.Execute("{DESCRIPTION}", ReplaceWith: data[4, 0]);

                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                }

                //Auswahl aufheben und Cursor an den Start des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                while (word.Selection.Find.Execute("{VEREDELUNG}"))
                {
                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                    word.Selection.Find.Execute("{VEREDELUNG}", ReplaceWith: data[7, 0]);

                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                }

                //Auswahl aufheben und Cursor an den Start des Documents rücken
                word.Selection.Move();
                word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                while (word.Selection.Find.Execute("{SUMME_ANZAHL}"))
                {
                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                    word.Selection.Find.Execute("{SUMME_ANZAHL}", ReplaceWith: data.GetLength(1).ToString());

                    //Auswahl aufheben und Cursor an den Start des Documents rücken
                    word.Selection.Move();
                    word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                }

                return word;
            }
            catch (Exception e)
            {
                word.Quit(SaveChanges: false);
                Marshal.ReleaseComObject(word);
                //sql.log("FEHLER", e, this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name);
                return null;
            }
        }
    }
}
